package org.cybzacg.encryption.enums;

/**
 * 加密状态枚举
 * 定义加密操作的状态
 * 
 * @author encryption team
 * @version 1.0
 */
public enum EncryptionStatus {
    
    /**
     * 成功
     */
    SUCCESS("成功", "加密或解密操作成功完成"),
    
    /**
     * 失败
     */
    FAILURE("失败", "加密或解密操作失败"),
    
    /**
     * 部分成功
     */
    PARTIAL_SUCCESS("部分成功", "批处理中部分操作成功"),
    
    /**
     * 超时
     */
    TIMEOUT("超时", "操作超时"),
    
    /**
     * 取消
     */
    CANCELLED("取消", "操作被取消"),
    
    /**
     * 密钥无效
     */
    INVALID_KEY("密钥无效", "提供的密钥无效"),
    
    /**
     * 算法不支持
     */
    ALGORITHM_NOT_SUPPORTED("算法不支持", "请求的算法不被支持"),
    
    /**
     * 数据格式错误
     */
    INVALID_DATA_FORMAT("数据格式错误", "输入数据格式不正确"),
    
    /**
     * 内存不足
     */
    OUT_OF_MEMORY("内存不足", "系统内存不足"),
    
    /**
     * 网络错误
     */
    NETWORK_ERROR("网络错误", "网络连接错误"),
    
    /**
     * 权限不足
     */
    PERMISSION_DENIED("权限不足", "没有足够的权限执行操作"),
    
    /**
     * 配置错误
     */
    CONFIGURATION_ERROR("配置错误", "配置参数错误"),
    
    /**
     * 未知错误
     */
    UNKNOWN_ERROR("未知错误", "未知的错误类型");
    
    private final String displayName;
    private final String description;
    
    EncryptionStatus(String displayName, String description) {
        this.displayName = displayName;
        this.description = description;
    }
    
    /**
     * 获取显示名称
     * 
     * @return 显示名称
     */
    public String getDisplayName() {
        return displayName;
    }
    
    /**
     * 获取描述
     * 
     * @return 描述
     */
    public String getDescription() {
        return description;
    }
    
    /**
     * 检查是否为成功状态
     * 
     * @return 是否为成功状态
     */
    public boolean isSuccess() {
        return this == SUCCESS || this == PARTIAL_SUCCESS;
    }
    
    /**
     * 检查是否为失败状态
     * 
     * @return 是否为失败状态
     */
    public boolean isFailure() {
        return this == FAILURE || this == TIMEOUT || this == CANCELLED ||
               this == INVALID_KEY || this == ALGORITHM_NOT_SUPPORTED ||
               this == INVALID_DATA_FORMAT || this == OUT_OF_MEMORY ||
               this == NETWORK_ERROR || this == PERMISSION_DENIED ||
               this == CONFIGURATION_ERROR || this == UNKNOWN_ERROR;
    }
    
    /**
     * 检查是否可以重试
     * 
     * @return 是否可以重试
     */
    public boolean isRetryable() {
        return this == TIMEOUT || this == NETWORK_ERROR || this == UNKNOWN_ERROR;
    }
    
    /**
     * 检查是否为用户错误
     * 
     * @return 是否为用户错误
     */
    public boolean isUserError() {
        return this == INVALID_KEY || this == INVALID_DATA_FORMAT || this == PERMISSION_DENIED;
    }
    
    /**
     * 检查是否为系统错误
     * 
     * @return 是否为系统错误
     */
    public boolean isSystemError() {
        return this == OUT_OF_MEMORY || this == NETWORK_ERROR || this == CONFIGURATION_ERROR;
    }
    
    /**
     * 根据名称查找状态
     * 
     * @param name 状态名称
     * @return 状态，如果未找到返回null
     */
    public static EncryptionStatus fromName(String name) {
        if (name == null) {
            return null;
        }
        
        try {
            return EncryptionStatus.valueOf(name.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
    
    /**
     * 根据显示名称查找状态
     * 
     * @param displayName 显示名称
     * @return 状态，如果未找到返回null
     */
    public static EncryptionStatus fromDisplayName(String displayName) {
        if (displayName == null) {
            return null;
        }
        
        for (EncryptionStatus status : values()) {
            if (status.getDisplayName().equals(displayName)) {
                return status;
            }
        }
        return null;
    }
    
    @Override
    public String toString() {
        return displayName + " (" + description + ")";
    }
}
